上一篇我們提到Doctrine ORM 提供的一些Filter,
可是身為工程師的我們也知道...客戶的需求有時候是五彩斑斕的黑,
我們也要想辦法變出來,一些我們想要但套件沒得使用的東西,我們必須自己來生,
所以除了前面的Validator,Service可以客製化外,當然Filter也可以阿!!
一貫做法當然就是開一個Class 然後去繼承相關的Class,然後裡面寫自己想要過濾的東西
Doctrine ORM底下提供的Filter 都是繼承 AbstractContextAwareFilter
所以首先,我們先再src下建立一個子目錄叫Filter,專門存放我們自己客製化的,
在裡面建立一個Class 然後extends AbstractContextAwareFilter
當我extends這個Class的時候,它會強迫我要實作兩個function,
通常如果有extends Class 然後看到紅蚯蚓的話,八九不離十就是要你實作啦~
所以我們就大力地把implement Methods 按下去吧
按下去之後,要實作的方法就是上面藍藍的那兩個,
filterPorperty是過濾器的主體,也就是我們必須將我們要過濾的條件和所代表的property寫在裡面,
description 是用來描述這個filter的一些屬性
protected function filterProperty(string $property, $value, QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null)
{
if (
$property !== "nameSearch"
) {
return;
}
$parameterName = $queryNameGenerator->generateParameterName($property);
if ($value = "小叮噹"){
$queryBuilder
->andWhere(sprintf('o.status = :%s', $parameterName))
->setParameter($parameterName, '小叮噹');
}
}
$property 是我們在使用這個filter時,所指定的欄位, 判斷如果不是我們所傳入的,就return掉這個filter ,
如果是的話才往下執行, 將我們傳入的property註冊成queryName,接著判斷我們傳入的值,
如果是該值的話,就幫我們從資料庫撈出來並回傳,以上舉例是,幫我回傳名字叫"小叮噹"的資料
public function getDescription(string $resourceClass): array
{
if (!$this->properties) {
return [];
}
$description = [];
foreach ($this->properties as $property => $strategy) {
$description["$property"] = [
'property' => $property,
'type' => 'string',
'required' => false,
'swagger' => [
'description' => 'Filter name',
'name' => 'nameFilter',
'type' => 'string',
],
];
}
return $description;
}
如果不是我們傳入的property,就回傳空的陣列,
如果是的話,就回傳,propert名稱,型態,描述等等...描述只是方便我們辨識我們用到的是哪個filter
建立完Filter了,我們必須使用在我們的實體類上,使用方法就跟使用ORM底下的Filter一樣
properties裡面放的就是我們在Filter裡所設定的,前面放的則是我們的Filter Class ,
記得要import 我們寫的Filter Class哦 ! 不然一樣會報500給各位看,
好像在報500前,那個class那邊的顏色就會警告了,聰明如IDE 會先提醒我們
這一篇把Filter講完了,下一篇要來介紹,api platform 裡提供的一個功能 => 換頁 ,及一些attributes的設定
原來今天已經過半了呀.....小菜鳥還在繼續慢慢地往前飛,應該是不會半路墜機啦XD